/**
 * 惠企政策爬虫定时任务
 * 用于定期执行政策爬虫脚本
 */
const { exec } = require('child_process');
const cron = require('node-cron');
const path = require('path');
const fs = require('fs');
const winston = require('winston');

// 创建日志目录
const logDir = path.join(__dirname, '../logs');
if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir, { recursive: true });
}

// 配置日志
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  defaultMeta: { service: 'policy-crawler' },
  transports: [
    new winston.transports.File({ filename: path.join(logDir, 'policy-crawler-error.log'), level: 'error' }),
    new winston.transports.File({ filename: path.join(logDir, 'policy-crawler.log') }),
    new winston.transports.Console({
      format: winston.format.combine(
        winston.format.colorize(),
        winston.format.simple()
      )
    })
  ],
});

// 爬虫脚本路径
const crawlerScriptPath = path.join(__dirname, 'crawl_policies.js');

/**
 * 执行爬虫脚本
 */
function runCrawler() {
  logger.info('开始执行政策爬虫');
  
  const command = `node ${crawlerScriptPath}`;
  
  exec(command, (error, stdout, stderr) => {
    if (error) {
      logger.error(`爬虫执行失败: ${error.message}`);
      return;
    }
    
    if (stderr) {
      logger.warn(`爬虫警告: ${stderr}`);
    }
    
    logger.info(`爬虫执行完成: ${stdout}`);
  });
}

// 初始执行
logger.info('政策爬虫定时任务已启动');
runCrawler();

// 设置定时任务，每天凌晨2点执行
cron.schedule('0 2 * * *', () => {
  logger.info('定时任务触发，开始执行政策爬虫');
  runCrawler();
});

// 防止程序退出
process.on('uncaughtException', (error) => {
  logger.error(`未捕获的异常: ${error.message}`, { stack: error.stack });
});

// 输出运行状态
logger.info('定时任务已设置，将在每天凌晨2点执行');
console.log('政策爬虫定时任务已启动，按 Ctrl+C 停止'); 